using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Boa.HD.AccesoDatos.Entidades;
using Boa.HD.AccesoDatos.Contratos;
using Boa.HD.Negocios.Servicios;
using Boa.HD.Negocios.Excepciones;
using Boa.HD.AccesoDatos.Entidades.DTO;
using Didsoft.AccesoUsuario.AccesoDatos.Entidades;
using Didsoft.AccesoUsuario.Negocios;

namespace Boa.HD.Negocios
{
   /// <summary>
   /// Implementacion de la interface IHD_TecnicoNegociosServicio, los metodos que estan definidos en el contrato IHD_TecnicoNegociosServicio serán accesibles desde un contexto externo
   /// </summary>	
   public class HD_TecnicoNegocios : IHD_TecnicoNegociosServicio
   {
	private IHD_TecnicoAccesoDatos accesoDatos;
	public HD_TecnicoNegocios()
	{		
		accesoDatos = DataFactory.Current.GetHD_TecnicoAccesoDatos();
	}
	
	/// <summary>
    /// Devuelve una lista de HD_Tecnico's de las ocurrencias encontradas a partir del filtro
    /// </summary>    
	public List<HD_Tecnico> BuscarPorFiltro(string filtro)
	{
		return accesoDatos.BuscarPorFiltro(filtro).ToList();
	}

	#region operaciones básicas
	
	/// <summary>
    /// Elimina la entidad HD_Tecnico, lanzará una excepcion si la entidad guarda dependencia a otras entidades
    /// </summary>	
	public void Eliminar(HD_Tecnico entidad)
	{
		try
		{
		    accesoDatos.Delete(accesoDatos.GetById(entidad.Id));
	    }
		catch(Exception ex)
		{
		   throw new HD_TecnicoEliminarExcepcion("HD_Tecnico");
		}
	}

    public void EliminarPorEmpleadoId(int EmpleadoId)
    {
        var tecnico = accesoDatos.GetAll().Where(p => p.EmpleadoId == EmpleadoId).FirstOrDefault();
        Eliminar(tecnico);
    }

	/// <summary>
    /// Devuelve HD_Tecnico, buscada por su Id, si no existe, entonces devuelve null
    /// </summary>	
	public HD_Tecnico ObtenerPorId(object Id)
	{
		return accesoDatos.GetById(Id);
	}

	/// <summary>
    /// Devuelve List<HD_Tecnico>, de todas la entidades de ese tipo
    /// </summary>	
	public List<HD_Tecnico> ObtenerTodas()
	{
		return accesoDatos.GetAll().ToList();
	}

	
	/// <summary>
    /// Guarda HD_Tecnico, previa ejecucion satisfactoria de las reglas de negocio
    /// </summary>	
	public HD_Tecnico Guardar(HD_Tecnico entidad)
	{
		//Agregar aqui las reglas de negocio.......	
		if(entidad==null)
		 throw new HD_TecnicoRequeridoExcepcion(); 
		
		
			
		if (entidad.Id == 0)
			accesoDatos.Insert(entidad);
		else
			accesoDatos.Update(entidad);

		return entidad;
	}

	#endregion

    public void AsignarTecnico(int PersonalSeleccionado)
    {
        BOAPersonalNegocios personalNegocios = new BOAPersonalNegocios();
        DtoBOAPersonal personaBoa =  personalNegocios.Seleccionar(PersonalSeleccionado);

        HD_TecnicoNegocios tecnicoNegocios = new HD_TecnicoNegocios();

        if (!tecnicoNegocios.ObtenerTodas().Where(p => p.EmpleadoId == PersonalSeleccionado).Any())
        {

            accesoDatos.BeginTransaction();

            try 
	        {
                HD_Tecnico tecnico = new HD_Tecnico();
                tecnico.EmpleadoId = PersonalSeleccionado;
                tecnico.FechaRegistro = DateTime.Now;
                tecnico.Guid = System.Guid.NewGuid().ToString();
                tecnico.Nombre = personaBoa.ToString();
                tecnico.UltimaActualizacion = DateTime.Now;
                tecnicoNegocios.Guardar(tecnico);


		         DUA_Persona persona = new DUA_Persona();
                 persona.Nombre = personaBoa.EmpleadoNombre;
                 persona.ApellidoPaterno = personaBoa.EmpleadoApellidoPaterno;
                 persona.ApellidoMaterno = personaBoa.EmpleadoApellidoMaterno;
                persona.GUID = System.Guid.NewGuid().ToString();
                persona.Lenguaje = "es-ES";
                persona.Genero = "M";
                persona.FechaNacimiento = DateTime.Now;
                persona.CIEmitidoEn = "LP";
                persona.CedulaIdentidad = "123456";

                DUA_PersonaNegocios personaNegocios = new DUA_PersonaNegocios();
                personaNegocios.Guardar(persona);


                DUA_RolNegocios rol_negocios = new DUA_RolNegocios();
                DUA_Rol rol = rol_negocios.ObtenerPorGuid("931CFD14-32E2-4DB5-B36E-6CCB236A1255");
                if (rol == null)
                {
                    rol = new DUA_Rol();
                    rol.Nombre = "Tecnicos BOA";
                    rol.Descripcion = "Tecnicos de soporte de BOA";
                    rol.ObtenerImagenDeBD = false;
                    rol.Predeterminado = true;
                    rol.GUID = "931CFD14-32E2-4DB5-B36E-6CCB236A1255";

                    rol_negocios.Guardar(rol);
                }

                DUA_Usuario usuario = new DUA_Usuario();
                usuario.Nombre = personaBoa.UsuarioNombre;
                usuario.Contrasena = personaBoa.UsuarioPassword;
                usuario.Bloqueado = false;
                usuario.Persona = persona;
                usuario.UltimoAcceso = DateTime.Now;
                usuario.PreguntaSeguridad = string.Empty;
                usuario.RespuestaSeguridad = string.Empty;
                usuario.Rol = rol;

                DUA_UsuarioNegocios usuarioNegocios = new DUA_UsuarioNegocios();
                usuarioNegocios.Guardar(usuario);

                accesoDatos.CommitTransaction();
	        }
	        catch (Exception e)
	        {
                accesoDatos.RollbackTransaction();
                throw e;
	        }


           





        }
        
    }
   }
}


